package base.list;

import base.entity.OpenedFile;

/**
 * 已打开文件表的类，使用枚举实现单例模式
 * OpenedFileList对象被创建，提供了一种访问其唯一的对象的方式，即OpenedFileList.SIGLETON.getFat()
 * @Author: x1aolone
 * @Date: 2019/9/28 13:42
 */
public enum OpenedFilesSingleton {

    INSTANCE;

    /**
     * 可同时打开的最大文件数
     */
    private final int MAX_OPENABLE_FILE_NUM = 5;

    /**
     * 已打开文件登记表中登记的文件数量
     */
    private int filenum = 0;

    /**
     * 已打开文件表
     */
    private OpenedFile[] list;

    /**
     * 构造方法，从文件中获取对象数据
     * JVM保证这个方法只调用一次，并且是私有的
     */
    OpenedFilesSingleton() {
        list = new OpenedFile[MAX_OPENABLE_FILE_NUM];
    }

    /**
     * @return 已打开文件登记表中登记的文件数量
     */
    public int size () {
        return filenum;
    }

    /**
     * @return 已打开文件登记表中可同时打开的最大文件数
     */
    public int getMaxOpenableFileNum () {
        return MAX_OPENABLE_FILE_NUM;
    }

    /**
     * 传入要插入的OpenedFile对象，试图插入队列,插入成功，返回true，插入失败，返回false
     * @param openedFile 要插入的OpenedFile对象
     * @return 插入成功，返回true，若队列已满，插入失败，返回false
     */
    public boolean add (OpenedFile openedFile) {
        for (int i = 0; i < MAX_OPENABLE_FILE_NUM; i++) {
            // 如果有空位，放入对象
            if (list[i] == null) {
                list[i] = openedFile;
                filenum++;
                return true;
            }
        }
        // 如果已打开文件登记表满了，插入失败
        return false;
    }

    /**
     * 传入要删除元素的绝对路径名，删除成功，返回true，删除失败，返回false
     * @param name 要删除元素的的绝对路径名
     * @return 删除成功，返回true，若队列无该对象，删除失败，返回false
     */
    public boolean remove (String name) {
        for (int i = 0; i < MAX_OPENABLE_FILE_NUM; i++) {
            // 如果找到绝对路径相同的对象，删除
            if (list[i] != null && list[i].getName().equals(name)) {
                list[i] = null;
                filenum--;
                return true;
            }
        }
        return false;
    }

    /**
     * 传入要查找元素的绝对路径名，查找成功返回该对象，查找失败返回null
     * @param name 查找元素的绝对路径名
     * @return 查找成功返回该对象，查找失败返回null
     */
    public OpenedFile search (String name) {
        for (int i = 0; i < MAX_OPENABLE_FILE_NUM; i++) {
            // 如果找到绝对路径相同的对象
            if (list[i] != null && list[i].getName().equals(name)) {
                return list[i];
            }
        }
        return null;
    }



//    /**
//     * 设置已打开登记表
//     * @return 设置成功返回true，设置失败返回false
//     */
//    public boolean setList (OpenedFile[] bytes) {
//        if (bytes == null || bytes.length != MAX_OPENABLE_FILE_NUM) {
//            return false;
//        } else {
//            list = bytes;
//            return true;
//        }
//    }

}
